#===============================================================================
# 1. 编译器配置
#===============================================================================
# 定义 C/C++ 编译器，可替换为你的交叉编译器路径
GCC_PATH = /home/honoka/tina-f133/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin
CC   = $(GCC_PATH)/riscv64-unknown-linux-gnu-gcc
CXX  = $(GCC_PATH)/riscv64-unknown-linux-gnu-g++

#===============================================================================
# 2. 依赖库和头文件路径
#===============================================================================
# 根目录路径，用于快捷构造其他路径
USER_PATH      = /home/honoka/tina-f133

# 库文件搜索路径（用空格分隔多个目录）
ROOT_LIB_DIR 	= $(USER_PATH)/out/f133-b-evb1/staging_dir/target/usr/lib \
					$(USER_PATH)/out/f133-b-evb1/staging_dir/target/lib

# 头文件搜索路径
ROOT_INC_DIR 	= $(USER_PATH)/out/f133-b-evb1/staging_dir/target/usr/include

# MQTT Paho 库路径
MQTT_LIB_DIR 	= $(USER_PATH)/user/mqtt_paho/paho.mqtt.c-1.3.0/install/lib
MQTT_INC_DIR 	= $(USER_PATH)/user/mqtt_paho/paho.mqtt.c-1.3.0/install/include

# LVGL 相关目录（可通过命令行覆盖）
LVGL_DIR_NAME  ?= lvgl
LVGL_DIR       ?= .

#===============================================================================
# 3. 编译和链接参数
#===============================================================================
# 常见优化与警告选项；-I 用于指定头文件搜索路径
CFLAGS         = -O3 -Wall \
                 -I$(ROOT_INC_DIR) \
                 -I$(MQTT_INC_DIR) \
                 -I$(LVGL_DIR) \
                 -Iscreen \
				 -IsquareLine

# C++ 额外标准支持
CXXFLAGS       = $(CFLAGS) -Ibsp_drivers -std=c++17

# 链接时所需的库及库搜索路径
# -L 指定库搜索目录，-lxxx 链接 libxxx.a / libxxx.so
LDFLAGS        = \
    -L$(MQTT_LIB_DIR) -lpaho-mqtt3as \
    $(addprefix -L, $(ROOT_LIB_DIR)) \
    -lm -ldl -lpthread -lssl -lcrypto -lmad -lasound

#===============================================================================
# 4. 构建输出目录与目标名称
#===============================================================================
BUILD_DIR      = build
BUILD_OBJ_DIR  = $(BUILD_DIR)/obj
BUILD_BIN_DIR  = $(BUILD_DIR)/bin

# 最终可执行文件名
BIN            = lvgl_demo
TARGET         = $(BUILD_BIN_DIR)/$(BIN)

#===============================================================================
# 5. 包含外部 Make 片段（LVGL 库的构建规则）
#    include 会将指定文件的内容插入到这里
#===============================================================================
include $(LVGL_DIR)/lvgl/lvgl.mk
include $(LVGL_DIR)/lv_drivers/lv_drivers.mk

#===============================================================================
# 6. 源文件收集
#===============================================================================
# 主入口
MAIN_SRC       = main.cc

# find 命令查找 .c 和 .cc/.cpp 文件
SQUARELINE_C_SRCS   := $(shell find squareLine -type f -name "*.c")

SCREEN_C_SRCS   := $(shell find screen -type f -name "*.c")
SCREEN_CPP_SRCS := $(shell find screen -type f \( -name "*.cc" -o -name "*.cpp" \))

BSP_DRIVERS_C_SRCS   := $(shell find bsp_drivers -type f -name "*.c")
BSP_DRIVERS_CPP_SRCS := $(shell find bsp_drivers -type f \( -name "*.cc" -o -name "*.cpp" \))

# 全部用户源文件集合
SRCS           = $(MAIN_SRC) $(SQUARELINE_C_SRCS) $(SCREEN_C_SRCS) $(SCREEN_CPP_SRCS) $(BSP_DRIVERS_C_SRCS) $(BSP_DRIVERS_CPP_SRCS)

#===============================================================================
# 7. 生成对象文件列表
#===============================================================================
# patsubst: 按模板将源文件名转换为目标对象名
# filter: 只选择符合后缀的文件列表
C_OBJS   := $(patsubst %.c,   $(BUILD_OBJ_DIR)/%.o, $(filter %.c,   $(SRCS)))
CPP_OBJS := $(patsubst %.cc,  $(BUILD_OBJ_DIR)/%.o, $(filter %.cc,  $(SRCS)))

# 如果还要编译 LVGL 库自带的 C 文件，可以在 lvgl.mk 中定义 CSRCS，
# 这里将其也添加到 OBJS 中：
OBJS      = $(C_OBJS) $(CPP_OBJS) $(patsubst %.c, $(BUILD_OBJ_DIR)/%.o, $(CSRCS))

#===============================================================================
# 8. 默认目标
#===============================================================================
.PHONY: all
all: $(TARGET)

#===============================================================================
# 9. 链接规则 —— 使用 C++ 链接器（保证链接 libstdc++）
#===============================================================================
# $@ 代表目标文件（TARGET），$^ 代表所有依赖（OBJS）
$(TARGET): $(OBJS)
	@mkdir -p $(BUILD_BIN_DIR)        # 确保输出目录存在
	$(CXX) -o $@ $^ $(LDFLAGS)        # 链接
	@echo "LD  $@"                    # 打印链接信息

#===============================================================================
# 10. 编译规则 —— 不同后缀用不同编译器
#     自动推导 $<（第一个依赖）和 $@（目标）
#===============================================================================
# 编译 .c -> .o
$(BUILD_OBJ_DIR)/%.o: %.c
	@mkdir -p $(dir $@)
	$(CC)  $(CFLAGS)   -c $< -o $@
	@echo "CC  $<"

# 编译 .cc -> .o
$(BUILD_OBJ_DIR)/%.o: %.cc
	@mkdir -p $(dir $@)
	$(CXX) $(CXXFLAGS) -c $< -o $@
	@echo "CXX $<"

#===============================================================================
# 11. 清理中间文件和可执行文件
#===============================================================================
.PHONY: clean
clean:
	rm -rf $(BUILD_DIR)
	@echo "Clean done."
